From 690e15ba4367784f3ac2134c5e68d52ee05e6cbb Mon Sep 17 00:00:00 2001
From: Andriy Grytsenko <andrej@rep.kiev.ua>
Date: Thu, 15 Nov 2012 21:08:51 +0200
Subject: [PATCH 11/22] smb:// symlinked locations cannot be launched from
 folder view.

This is because we don't assume each symlink is a folder anymore
(that assuming was stupid anyway) so we check how to handle the
symlink target. We have to get info on the target. If target isn't
mounted we cannot retrieve info on it and FmFileInfoJob fails.
Therefore we cannot launch the location.
The commit adds creation of simplest file info which contains only
name and type (directory) for not mounted location.
---
 src/job/fm-file-info-job.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/job/fm-file-info-job.c b/src/job/fm-file-info-job.c
index 19acb1b..69eb37d 100644
--- a/src/job/fm-file-info-job.c
+++ b/src/job/fm-file-info-job.c
@@ -165,6 +165,24 @@ static gboolean fm_file_info_job_run(FmJob* fmjob)
             gf = fm_path_to_gfile(path);
             if(!_fm_file_info_job_get_info_for_gfile(fmjob, fi, gf, &err))
             {
+              if(err->domain == G_IO_ERROR && err->code == G_IO_ERROR_NOT_MOUNTED)
+              {
+                GFileInfo *inf;
+                /* location by link isn't mounted; unfortunately we cannot
+                   launch a target if we don't know what kind of target we
+                   have; lets make a simplest directory-kind GFIleInfo */
+                /* FIXME: this may be dirty a bit */
+                g_error_free(err);
+                err = NULL;
+                inf = g_file_info_new();
+                g_file_info_set_file_type(inf, G_FILE_TYPE_DIRECTORY);
+                g_file_info_set_name(inf, fm_path_get_basename(path));
+                g_file_info_set_display_name(inf, fm_path_get_basename(path));
+                fm_file_info_set_from_gfileinfo(fi, inf);
+                g_object_unref(inf);
+              }
+              else
+              {
                 FmJobErrorAction act = fm_job_emit_error(fmjob, err, FM_JOB_ERROR_MILD);
                 g_error_free(err);
                 err = NULL;
@@ -175,6 +193,7 @@ static gboolean fm_file_info_job_run(FmJob* fmjob)
                 }
 
                 fm_file_info_list_delete_link(job->file_infos, l); /* also calls unref */
+              }
             }
             g_object_unref(gf);
         }
-- 
1.8.0.1

